package com.jcli._socket基恩士客户端;// 导入所需的类库

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.*;
import java.net.Socket;

// 创建一个名为 SocketClient01 的类，继承自 JFrame 类，用于创建窗口和用户界面
public class SocketClient01 extends JFrame {
    // 声明界面中的组件
    private JTextField ipField; // IP 地址文本框
    private JTextField portField; // 端口号文本框
    private JButton connectButton; // 连接按钮
    private JButton disconnectButton; // 断开连接按钮
    private JTextArea receivedDataArea; // 用于显示接收到的数据的文本区域
    private Socket socket; // Socket 对象，用于建立连接
    private PrintWriter out; // 用于发送数据的 PrintWriter
    private BufferedReader in; // 用于接收数据的 BufferedReader

    // 构造函数，初始化界面和组件
    public SocketClient01() {
        // 设置窗口标题和关闭操作
        setTitle("Socket Client");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setSize(400, 300);

        // 创建顶部的面板，并设置布局为 FlowLayout
        JPanel topPanel = new JPanel();
        topPanel.setLayout(new FlowLayout());

        // 创建 IP 地址和端口号的标签和文本框，并设置默认值
        JLabel ipLabel = new JLabel("IP:");
        ipField = new JTextField(10);
        ipField.setText("127.0.0.1");

        JLabel portLabel = new JLabel("Port:");
        portField = new JTextField(5);
        portField.setText("8080");

        // 创建连接和断开连接按钮
        connectButton = new JButton("Connect");
        disconnectButton = new JButton("Disconnect");
        disconnectButton.setEnabled(false); // 初始化时禁用断开连接按钮

        // 将标签、文本框和按钮添加到顶部面板
        topPanel.add(ipLabel);
        topPanel.add(ipField);
        topPanel.add(portLabel);
        topPanel.add(portField);
        topPanel.add(connectButton);
        topPanel.add(disconnectButton);

        // 创建文本区域并设置为只读
        receivedDataArea = new JTextArea();
        receivedDataArea.setEditable(false);

        // 将文本区域添加到滚动面板
        JScrollPane scrollPane = new JScrollPane(receivedDataArea);

        // 将顶部面板放置在窗口的北部（上方），滚动面板放置在中央
        add(topPanel, BorderLayout.NORTH);
        add(scrollPane, BorderLayout.CENTER);

        // 为连接按钮和断开连接按钮添加监听器
        connectButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                if (socket != null && socket.isClosed()) {
                    connect(); // 连接按钮的监听器调用 connect() 方法
                } else {
                    connect(); // 连接按钮的监听器调用 connect() 方法
                }

            }
        });

        disconnectButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                new Thread(new Runnable() {
                    @Override
                    public void run() {
                        disconnect(); // 断开连接按钮的监听器调用 disconnect() 方法
                    }
                }).start();
            }
        });
    }

    // connect 方法尝试建立与指定 IP 地址和端口号的连接
    private void connect() {
        // 获取用户输入的 IP 地址和端口号
        String ip = ipField.getText();
        int port = Integer.parseInt(portField.getText());
        try {
            // 创建 Socket 对象，建立连接
            socket = new Socket(ip, port);
            // 创建 PrintWriter 和 BufferedReader 对象，用于数据的发送和接收
            out = new PrintWriter(socket.getOutputStream(), true);
            in = new BufferedReader(new InputStreamReader(socket.getInputStream()));

            // 连接成功后，禁用连接按钮，启用断开连接按钮
            connectButton.setEnabled(false);
            disconnectButton.setEnabled(true);

            // 启动一个新线程，用于接收服务器发送的数据并在文本区域中显示
            // 在接收数据的线程中添加写入CSV文件的逻辑
            new Thread(new Runnable() {
                @Override
                public void run() {
                    try {
                        String receivedData;
                        BufferedWriter writer = new BufferedWriter(
                                new FileWriter("received_data.csv", true)); // 打开CSV文件，true表示追加写入
                        while ((receivedData = in.readLine()) != null) {
                            receivedDataArea.append(receivedData + "\n");

                            // 写入CSV文件
                            writer.write(receivedData);
                            writer.newLine();
                            writer.flush(); // 刷新缓冲区，确保数据被写入文件
                        }
                        writer.close(); // 关闭写入流
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }).start();


        } catch (IOException e) {
            e.printStackTrace();
            // 连接失败时弹出错误消息框
            JOptionPane.showMessageDialog(null, "Connection failed: " + e.getMessage(), "Error", JOptionPane.ERROR_MESSAGE);
        }
    }

    // disconnect 方法关闭连接
    private void disconnect() {
        try {
            // 关闭 BufferedReader、PrintWriter 和 Socket 对象
            if (in != null)
                in.close();
            if (out != null)
                out.close();
            if (socket != null)
                socket.close();
        } catch (IOException e) {
            e.printStackTrace();
        }

        // 连接断开后，启用连接按钮，禁用断开连接按钮
        connectButton.setEnabled(true);
        disconnectButton.setEnabled(false);
    }

    // 主方法，启动应用程序
    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                // 创建 SocketClient01 对象并显示界面
                SocketClient01 client = new SocketClient01();
                client.setVisible(true);
            }
        });
    }
}
